// Iterator 遍历器 提供 for of  一句话 不支持遍历的数据结构 ”可遍历“
function makeIterator(arr) {
  let nextIndex = 0;
  return {
    next() {
      return nextIndex < arr.length ? {
        value: arr[nextIndex++],
        done: false
      } : {
        value: undefined,
        done: true
      }
    }
  }
}
let it = makeIterator()
console.log(it.next()); // value a done false



let courses= {
  allCourse: { 
    fontEnd: ['es', 'vue', 'Vue', 'React'],
    backend: ['java', 'python', 'springboot'],
    webapp: ['android', 'ios']
  }
}

// for(let c of course )

// 原声具备 inerator 接口的数据类型
// Array Map Set String TypedArray 函数的arguments NodeList对象

// 可迭代协议: Symbol.iterator
// 迭代器协议: return { next() { return{value, done}}}

courses[Symbol.iterator] = function() {
  let allCourse = this.allCourse
  let keys = Reflect.ownKeys(allCourse)
  let values = []
  return {
    next() {
      if(!values.length) {
        if(keys.length) {
          values = allCourse[keys[0]]
          keys.shift()
        }
      }
      return {
        done: !values.length,
        value: values.shift()
      }
    }
  }
}

//为什么不直接取值?  在其他模块用到这个时,都可以直接for of 实现,而不需要重复定义
for(let c of courses) {
  console.log(c);
}

// generator
courses[Symbol.iterator] = function* () {
  let allCourse = this.allCourse
  let keys = Reflect.ownKeys(allCourse)
  let values = []
  while(1) {
    if(!values.length) {
      if(keys.length) {
        values = allCourse[keys[0]]
        keys.shift()
        yield values.shift()
      }else {
        yield values.shift()
      }
    }
  }
}